package com.borened.common.boot.security;

import com.borened.common.core.constant.SecurityConstants;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 线程安全的jwt工具类
 * <p>
 * 用于异步线程中获取主线程中的请求参数信息。这些信息一般指jwt payload载荷参数。
 * 注意和JwtUtils类的区别。
 * </p>
 *
 * @author: cch
 * @since: 2022-5-9
 * @see SecurityContextHolder
 */
public class SecurityJwtUtils {

    /**
     * 解析JWT获取用户ID
     *
     * @return
     */
    public static Long getUserId() {
        return SecurityContextHolder.get(SecurityConstants.JWT_USER_ID_KEY, Long.class);
    }

    /**
     * 解析JWT获取获取用户名
     *
     * @return
     */
    public static String getUsername() {
        String username = SecurityContextHolder.get(SecurityConstants.JWT_USER_NAME_KEY);
        return username;
    }

    /**
     * JWT获取用户角色列表
     *
     * @return 角色列表
     */
    public static Set<String> getRoles() {
        HashSet<String> roles = SecurityContextHolder.get(SecurityConstants.JWT_AUTHORITIES_KEY, HashSet.class);
        return roles;
    }

    /**
     * 获取第一个可用的角色标识
     *
     * @return
     */
    public static String getRole() {
        Set<String> roles = getRoles();
        Iterator<String> iterator = roles.iterator();
        if (iterator.hasNext()) {
            return iterator.next();
        }
        return null;
    }

    /**
     * 从jwt中获取已认证的客户端标识
     *
     * @return
     */
    public static String getClientId() {
        String clientId = SecurityContextHolder.get(SecurityConstants.JWT_CLIENT_ID_KEY);
        return clientId;
    }

    /**
     * 从jwt中获取应用标识
     *
     * @return
     */
    public static Integer getAppId() {
        Integer appId = SecurityContextHolder.get(SecurityConstants.JWT_APPLICATION_ID_KEY, Integer.class);
        return appId;
    }

    /**
     * 从jwt中获取当前用户所在部门编码
     *
     * @return
     */
    public static Long getDeptId() {
        return SecurityContextHolder.get(SecurityConstants.JWT_DEPT_ID_KEY, Long.class);
    }

    /**
     * 从jwt中获取当前行政编码
     *
     * @return
     */
    public static Long getRegionCode() {
        return SecurityContextHolder.get(SecurityConstants.JWT_REGION_CODE_KEY, Long.class);
    }

}
